/**
 * @desc reduce 函数 
 * reduce(callback,iniValue)
 *      callback是执行数组中每个值的函数
 *          callback(accumulator,curValue,curIndex,arr)
 *              累加器之前的结果，当前元素值，当前元素索引，正在处理的arr
 *      inivalue    
 *          用作第一个调用 callback的第一个参数的值
 *          如果没有设置，则默认为数组中的第一个元素
 * 
 *  reduce 实现累加
 *      add(arr){
 *          return arr.reduce((before,after)=>before+after)
 *      }
 */

 /*******************
  *  @func 1-累加器：输入一个数组，返回数组之和
  ******************/

let res = add([1, 2, 3, 4]);
//console.log(res)
function add(arr){
  // return arr.reduce((before,after)=>before+after) // 10
  return arr.reduce((before,after)=>before+after,5)// 输出的是15 
}


 /*******************
  *  @func     2-桶的作用：对只含[0,1,2]的数组统计012的出现次数
  *  @return   [0,1,1,2,2,2,2] ===> [0,2,4]表示012分别出现了024次
  *   思路:
  *         初始化[0,0,0] 
            const counts = nums.reduce((agg, num) => {
                agg[num]++;
                return agg;
            }, [0, 0, 0]);     
            agg 承接自初始值，num即当前遍历到的数组的值
            callback里返回 agg 即agg从初始值做为累加器一直传递下去 从而实现统计数
            十分类似于桶排序。
            改造一下，我们利用桶排序的思维

            一个数组，求最大最小值，然后初始化数组填充max-min+1 个0.
            arr[0]==> 对应 min元素

  ******************/
/*

  // 正常的分配桶
let arr = [2,5,3,4,2,7];
  // [2,3,4,5,6,7]
  // [2,1,1,1,0,1]

let min = Math.min.apply(Math,arr);
let max = Math.max.apply(Math,arr);
let count = new Array(max-min+1);

for(let i=0;i<arr.length;i++){
    count[arr[i]] = (count[arr[i]]||0)+1;
}
console.log(count)
// ===> [0,1,2,3,4,5,6,7]
// ===> [ , ,2,1,1,1, ,1]


*/

// reduce 的桶计数
/*
let arr = [2,5,3,4,2,7];
let max = Math.max.apply(Math,arr);
let initArr = new Array(max+1).fill(0);

const count = arr.reduce((agg,num)=>{
    agg[num]++;
    return agg;
},initArr)
console.log(count);

*/

// 计算字符串的hash
/*
    const hash = Array.from(key).reduce(
        (hashAccumulator, keySymbol) => (hashAccumulator + keySymbol.charCodeAt(0)),
        0
    );



*/



/**
 * 数组去重
 * 
 * //对arr去重
    var hash = {};
    var arr = [{
            type: 1
        },
        {
            type: 1
        },
        {
            type: 2
        }
    ]
    arr = arr.reduce(function (item, next) {
        hash[next.type] ? '' : hash[next.type] = true && item.push(next);
        return item
    }, [])
 * 
 * 
 * 
 */



// 你用reduce 做过什么事
// 暂时找不到
// 高阶函数
// https://zhuanlan.zhihu.com/p/28835709